﻿/**
 * Create in 2012-4-5.
 */
package kit4j.common.event;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 事件同步发送者抽象实现类。<br />
 * 实现了事件发送者的一些默认操作(如事件监听器管理)，方便开发者创建时间发送者实现。该实现的{@link #fireEvent(Object)}方法会迅速返回，并创建一个新的线程来发送事件。
 * 
 * @author MiniKnife
 * 
 */
public abstract class AbstractConcurrentEventFirer<L, E> extends AbstractEventFirer<L, E> {

	/**
	 * 线程执行器。
	 */
	private ExecutorService executor;

	/**
	 * 创建一个事件发送者。
	 */
	public AbstractConcurrentEventFirer() {
		executor = Executors.newCachedThreadPool();
	}

	/**
	 * @see kit4j.common.event.AbstractEventFirer#fireEvent(java.lang.Object)
	 */
	@Override
	public void fireEvent(final E evt) {
		final List<L> list = new ArrayList<L>(listenerSet);
		
		executor.submit(new Runnable() {

			@Override
			public void run() {
				for (L listener : list) {
					fireEventToListener(evt, listener);
				}
			}

		});
	}

}
